package com.kexio.security.domain;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.kexio.core.data.domain.BaseEntity;
import com.kexio.security.domain.enums.RoleStatus;
import com.kexio.security.domain.enums.RoleType;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * 角色实体
 * 
 * @author Kexio Team
 * @since 1.0.0
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("sys_role")
@Schema(description = "角色实体")
public class Role extends BaseEntity {

    /**
     * 角色编码
     */
    @NotBlank(message = "角色编码不能为空")
    @Size(min = 2, max = 50, message = "角色编码长度必须在2-50之间")
    @Pattern(regexp = "^[A-Z_]+$", message = "角色编码只能包含大写字母和下划线")
    @TableField("role_code")
    @Schema(description = "角色编码", example = "ADMIN")
    private String roleCode;

    /**
     * 角色名称
     */
    @NotBlank(message = "角色名称不能为空")
    @Size(min = 2, max = 50, message = "角色名称长度必须在2-50之间")
    @TableField("role_name")
    @Schema(description = "角色名称", example = "系统管理员")
    private String roleName;

    /**
     * 角色类型
     */
    @TableField("role_type")
    @Schema(description = "角色类型", example = "0")
    private Integer roleType;

    /**
     * 角色状态
     */
    @TableField("status")
    @Schema(description = "角色状态", example = "1")
    private Integer status;

    /**
     * 显示顺序
     */
    @TableField("sort_order")
    @Schema(description = "显示顺序", example = "1")
    private Integer sortOrder;

    /**
     * 数据范围
     * 1-全部数据权限，2-自定数据权限，3-本部门数据权限，4-本部门及以下数据权限，5-仅本人数据权限
     */
    @TableField("data_scope")
    @Schema(description = "数据范围", example = "1")
    private Integer dataScope;

    /**
     * 角色描述
     */
    @Size(max = 500, message = "角色描述长度不能超过500")
    @TableField("description")
    @Schema(description = "角色描述", example = "系统管理员角色")
    private String description;

    /**
     * 租户ID
     */
    @TableField("tenant_id")
    @Schema(description = "租户ID", example = "1")
    private Long tenantId;

    /**
     * 备注
     */
    @Size(max = 500, message = "备注长度不能超过500")
    @TableField("remark")
    @Schema(description = "备注", example = "系统内置角色")
    private String remark;

    // =========================== 便利方法 ===========================

    /**
     * 获取角色类型枚举
     * @return 角色类型枚举
     */
    public RoleType getRoleType() {
        return RoleType.fromCode(this.roleType);
    }

    /**
     * 设置角色类型
     * @param roleType 角色类型枚举
     */
    public void setRoleType(RoleType roleType) {
        this.roleType = roleType != null ? roleType.getCode() : null;
    }

    /**
     * 获取角色状态枚举
     * @return 角色状态枚举
     */
    public RoleStatus getRoleStatus() {
        return RoleStatus.fromCode(this.status);
    }

    /**
     * 设置角色状态
     * @param roleStatus 角色状态枚举
     */
    public void setRoleStatus(RoleStatus roleStatus) {
        this.status = roleStatus != null ? roleStatus.getCode() : null;
    }

    /**
     * 检查角色是否启用
     * @return 是否启用
     */
    public boolean isEnabled() {
        RoleStatus roleStatus = getRoleStatus();
        return roleStatus != null && roleStatus.isEnabled();
    }

    /**
     * 检查角色是否禁用
     * @return 是否禁用
     */
    public boolean isDisabled() {
        RoleStatus roleStatus = getRoleStatus();
        return roleStatus != null && roleStatus.isDisabled();
    }

    /**
     * 检查是否为系统角色
     * @return 是否系统角色
     */
    public boolean isSystemRole() {
        RoleType type = getRoleType();
        return type != null && type.isSystem();
    }

    /**
     * 检查是否为业务角色
     * @return 是否业务角色
     */
    public boolean isBusinessRole() {
        RoleType type = getRoleType();
        return type != null && type.isBusiness();
    }

    /**
     * 检查是否为临时角色
     * @return 是否临时角色
     */
    public boolean isTemporaryRole() {
        RoleType type = getRoleType();
        return type != null && type.isTemporary();
    }

    // ===================== 手写的Getter方法 =====================
    
    public String getRoleCode() { return roleCode; }
    public String getRoleName() { return roleName; }
    public Integer getStatus() { return status; }
    public Integer getSortOrder() { return sortOrder; }
    public String getDescription() { return description; }
    public Long getTenantId() { return tenantId; }
    public String getRemark() { return remark; }
}
